package cn.tedu._05weibo.base.base.exception;

import cn.tedu._05weibo.base.response.JsonResult;
import cn.tedu._05weibo.base.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

@RestControllerAdvice
@Slf4j
/*
1.标识此类为全局异常处理器
-------------异常处理顺序-----------------
1.一旦控制器抛出异常，则先检查是否定义了全局异常处理器；
2.如果有，则检查是否定义了对应的异常处理器
3.如果定义了，则调用该方法处理异常；
  如果未定义，则调用该异常的父类异常的处理方法
4.如果父类异常也未定义，则使用默认的异常处理机制【不友好】
会自动调用此类的异常处理方法
 */
public class GlobalExceptionHandler {
    //一、IllegalArgumentException处理异常（子类）
    @ExceptionHandler
    public JsonResult doHandle(IllegalArgumentException ex){
        String data= ex.getMessage(); //获取异常消息
        log.error("IllegalArgumentException:"+data);

        return JsonResult.fail(data);
    }
    @ExceptionHandler
    public JsonResult doHandleMethodArgumentException(MethodArgumentNotValidException ex){
        String data=ex.getFieldError().getDefaultMessage();
        log.error("MethodArgumentNotValidException:"+data);
        return new JsonResult(StatusCode.VALIDATE_ERROR,data);
    }
    @ExceptionHandler
    public JsonResult doHandleConstraintViolationException(ConstraintViolationException ex){
        String data=ex.getMessage().split(":")[1].trim();
        log.error("ConstraintViolationException:"+data);
        return new JsonResult(StatusCode.VALIDATE_ERROR,data);
    }













    //二、RuntimeException处理异常（父类）
//    @ExceptionHandler
//    public JsonResult doHandlerRuntimeException(RuntimeException ex){
//    String data = ex.getMessage();
//    log.error("RuntimeException:"+data);
//    return JsonResult.fail(data);
//
//
//}
/*
处理所有异常
 */
//    @ExceptionHandler
//    public JsonResult doHandleThrowable(Throwable ex){
//        String data=ex.getMessage();
//        log.error("Throwable；"+data);
//        return  new JsonResult(StatusCode.THROWABLE_ERROR,data);
//    }
}
